import java.util.Scanner;
//题目地址：https://www.acwing.com/problem/content/6126/
public class 哞叫时间 {
    private static int Len = 26;
    private static int[][] sCovert = new int[Len][Len];
    private static boolean[][] judge = new boolean[Len][Len];
    //至少出现的次数
    private static int[] instr;
    private static int F;
    //字符串长度
    private static int N;
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        N = scan.nextInt();
        instr = new int[N];
        F = scan.nextInt();
        scan.nextLine();
        //先获得一个字符串
        String str = scan.nextLine();
        //将字符串中的每一个字符转为数字
        for (int i = 0; i < N; i++) {
            instr[i] = str.charAt(i) - 'a';
        }
        //统计各个ABB形式出现的次数：用对应的AB数组去计数
        Update(0, N - 1, 1);
        //考虑字符错误情况

        for (int i = 0; i < N; i++) {
            int temp = instr[i];
            for (int j = 0; j < 26; j++) {
                //将某一个位置关联的字符串出现次数减1
                Update(i - 2, i + 2, -1);
                if (temp != j) {
                    instr[i] = j;
                    // 新的加1
                    Update(i - 2, i + 2, 1);
                    //恢复旧的：先新的减1，
                    Update(i - 2, i + 2, -1);
                    //然后把当前位变回去
                }
                instr[i] = temp;
                //再旧的加1
                Update(i - 2, i + 2, 1);
            }
        }
        //输出可能的情况数和所有的组合
        int res=0;
        for (int i = 0; i < Len; i++) {
            for (int j = 0; j < Len; j++) {
                if (judge[i][j])
                    res++;
            }
        }
        System.out.println(res);
        for (int i = 0; i < Len; i++) {
            for (int j = 0; j < Len; j++) {
                if (judge[i][j]) {
                    char A = (char) (i + 'a');
                    char B = (char) (j + 'a');
                    String s = "" + A + B + B;
                    System.out.println(s);
                }
            }
        }
    }

    private static void Update(int start, int end, int v) {
        //todo 考虑start和end的大小
        start = Math.max(start, 0);
        end = Math.min(end, N-1);
        for (int i = start; i <= end - 2; i++) {
            int a = instr[i];
            int b = instr[i + 1];
            int c = instr[i + 2];
            if (a != b && b == c) {
                sCovert[a][b] += v;
                if (sCovert[a][b] >= F) {
                    //如果出现次数大于等于F，则将对应数组设置成true
                    judge[a][b] = true;
                }
            }
        }
    }
}
/*
反思
犯的错误有：
①刚开始考虑区间的时候就不对，每一个字符要影响三个字符串，最开始只考虑了一个
②res++不应该写在update函数里面。如果写里面了，每调用一次update，满足条件时都会res++，就会重复加很多次
③区间边界考虑不周，写的时候脑子乱了，应该统一标准：都按下标来。
 */